home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk8 / asm / echo.lst < prev    next >
File List  |  1995-03-18  |  17KB  |  306 lines

  1.  
  2.       ** Asm68k 68000 Macro Assembler **
  3.  
  4.  
  5.  LINE   PC         CODE         -----CARD------->
  6.     1 0000:                     ;
  7.     2 0000:                     ;   Yet another ECHO .. Jim Butterfield, 1988Apr2
  8.     3 0000:                     ;
  9.     4 0000:                     ;- This is a CLI command only.  Replaces ECHO 1.3 with NOLINE feature.
  10.     5 0000:                     ;- Usage: Echo [NOLINE] <string>     ..or.. <string> [NoLine]
  11.     6 0000:                     ;
  12.     7 0000:                     ;-  Quotes (") around the argument <string> are unnecessary
  13.     8 0000:                     ;    unless you wish to have leading spaces or to type NOLINE,
  14.     9 0000:                     ;    for example: Echo "    Never say NoLine"
  15.    10 0000:                     ;
  16.    11 0000:                     ;-  Asterisks are handled as follows:
  17.    12 0000:                     ;      *n or *N - outputs a Newline (linefeed);
  18.    13 0000:                     ;      *e or *E - outputs an Escape (chr${27});
  19.    14 0000:                     ;      *[anything else] prints the character after asterisk,
  20.    15 0000:                     ;                in particular:
  21.    16 0000:                     ;           ** - outputs an asterisk;
  22.    17 0000:                     ;           *" - outputs quotes (");
  23.    18 0000:                     ;      Example: Echo Input**Output 2 3 4
  24.    19 0000:                     ;     displays: Input*Output 2 3 4
  25.    20 0000:                     ; ===    Register Usage (* = used in system calls)  ===
  26.    21 0000:                     ;    *A0 - general pointer       *D0 - general byte buffer
  27.    22 0000:                     ;    *A1 - otherwise unused      *D1 - otherwise unused
  28.    23 0000:                     ;     A2 - output buf scan       *D2 - output buf pointer
  29.    24 0000:                     ;     A3 - input buf pointer     *D3 - output length
  30.    25 0000:                     ;     A4 - input scan ptr         D4 - LINK pointer
  31.    26 0000:                     ;     A5 - main scan ptr          D5 - NOLINE flag
  32.    27 0000:                     ;     A6 - library pointer        D6 - asterisk flag, buffer
  33.    28 0000:                     ;     A7 - gosh, I forget         D7 - DOS output handle
  34.    29 0000:                     
  35.    30 0000:                     ;-- Symbolic equates:
  36.    31 0000:                     AbsExecBase equ $4        ; Loc of ptr to the
  37.    32 0000:                                               ;   Exec library.
  38.    33 0000:                     LF          equ 10        ; Line Feed value.
  39.    34 0000:                     SPACE       equ 32        ; Space char
  40.    35 0000:                     CASEmask    equ %01011111 ; Mask to kill lower case.
  41.    36 0000:                     ;
  42.    37 0000:                                 xref _LVOOpenLibrary  ; These are Library routines referenced
  43.    38 0000:                                 xref _LVOCloseLibrary ; externally by this program.
  44.    39 0000:                                 xref _LVOOutput
  45.    40 0000:                                 xref _LVOWrite
  46.    41 0000:                                 xref _LVOInput
  47.    42 0000:                                 xref _LVORead
  48.    43 0000:                     ;
  49.    44 0000:                     ;  Save pointer and open DOS
  50.    45 0000:7A00                 _main       moveq   #0,d5            ; clear noline flag
  51.    46 0002:2648                             move.l  a0,a3            ; pointer, input-buffer
  52.    47 0004:2A48                             move.l  a0,a5            ; work pointer
  53.    48 0006:43FA011A                         lea     dosname(pc),a1
  54.    49 000A:4240                             clr     d0               ;   Any version
  55.    50 000C:2C780004                         move.l  AbsExecBase,a6
  56.    51 0010:4EAE0000                         jsr     _LVOOpenLibrary(a6)  ;Open Dos library.
  57.    52 0014:2C40                             move.l  d0,a6            ; Remember dosbase ptr.
  58.    53 0016:67000108                         beq     quit
  59.    54 001A:                     ;
  60.    55 001A:                     ;-- Get CLI outhandle:
  61.  
  62.       ** Asm68k 68000 Macro Assembler **
  63.  
  64.  
  65.  LINE   PC         CODE         -----CARD------->
  66.    56 001A:4EAE0000                         jsr _LVOOutput(a6)       ;   get CLI outhandle,
  67.    57 001E:2E00                             move.l d0,d7             ;   & then remember it.
  68.    58 0020:                     ; grab stack space
  69.    59 0020:4E54FF00                         link    a4,#-$100
  70.    60 0024:280C                             move.l  a4,d4
  71.    61 0026:244F                             move.l  a7,a2            ;  pointer, output-buffer
  72.    62 0028:                     ;  Check for ? sequence
  73.    63 0028:284D                 qspace      move.l  a5,a4
  74.    64 002A:0C1D0020                         cmp.b   #SPACE,(a5)+
  75.    65 002E:67F8                             beq.s   qspace
  76.    66 0030:2A4C                             move.l  a4,a5
  77.    67 0032:0C1C003F                         cmp.b   #$3F,(a4)+
  78.    68 0036:662C                             bne.s   ljob
  79.    69 0038:0C14000A                         cmp.b   #LF,(a4)
  80.    70 003C:6626                             bne.s   ljob
  81.    71 003E:                     ;  Do the prompt thing
  82.    72 003E:41FA00F6                         lea     template(pc),a0
  83.    73 0042:2408                             move.l  a0,d2
  84.    74 0044:2207                             move.l  d7,d1
  85.    75 0046:263C00000011                     move.l  #templen,d3
  86.    76 004C:4EAE0000                         jsr     _LVOWrite(a6)
  87.    77 0050:4EAE0000                         jsr     _LVOInput(a6)
  88.    78 0054:2200                             move.l  d0,d1
  89.    79 0056:264A                             move.l  a2,a3            ;  switch input-buffer
  90.    80 0058:240B                             move.l  a3,d2
  91.    81 005A:263C000000FF                     move.l  #255,d3
  92.    82 0060:4EAE0000                         jsr     _LVORead(a6)
  93.    83 0064:                     ;  Scan leading spaces and mebbe NOLINE
  94.    84 0064:                     ;
  95.    85 0064:2A4B                 ljob        move.l  a3,a5            ; input-buffer pointer
  96.    86 0066:284D                 lspace      move.l  a5,a4            ; first non-space
  97.    87 0068:0C1D0020                         cmp.b   #SPACE,(a5)+
  98.    88 006C:67F8                             beq.s   lspace           ; space .. correct it
  99.    89 006E:2A4C                             move.l  a4,a5
  100.    90 0070:4A05                             tst.b   d5               ; if we've found NOLINE..
  101.    91 0072:6618                             bne.s   nonoline1        ;   ..don't search again
  102.    92 0074:                     ; search for NOLINE <space> at start
  103.    93 0074:41FA00B9                         lea     nolnstr(pc),a0
  104.    94 0078:101C                 nolinecklp  move.b  (a4)+,d0         ; text char
  105.    95 007A:0200005F                         andi.b  #CASEmask,d0
  106.    96 007E:B018                             cmp.b   (a0)+,d0         ; NOLINE mask char
  107.    97 0080:660A                             bne.s   nonoline1
  108.    98 0082:4A00                             tst.b   d0               ; <space> becomes $0
  109.    99 0084:66F2                             bne.s   nolinecklp       ; if not space, back
  110.   100 0086:                     ; found NOLINE <space>
  111.   101 0086:7A01                             moveq   #1,d5            ; set NOLINE flag
  112.   102 0088:2A4C                             move.l  a4,a5
  113.   103 008A:60DA                             bra.s   lspace           ; trim extra spaces
  114.   104 008C:                     ; scan to end of input, trim end spaces            
  115.   105 008C:284D                 nonoline1   move.l  a5,a4
  116.   106 008E:0C1C000A             findend     cmpi.b  #LF,(a4)+        ; search for LF
  117.   107 0092:66FA                             bne.s   findend
  118.   108 0094:193C0000             espace      move.b  #0,-(a4)         ; change end to $0
  119.   109 0098:204C                             move.l  a4,a0
  120.   110 009A:0C200020                         cmp.b   #SPACE,-(a0)
  121.  
  122.       ** Asm68k 68000 Macro Assembler **
  123.  
  124.  
  125.  LINE   PC         CODE         -----CARD------->
  126.   111 009E:67F4                             beq.s   espace           ; back through spaces
  127.   112 00A0:4A05                             tst.b   d5               ; if we've found NOLINE..
  128.   113 00A2:6618                             bne.s   nonoline2        ;  ..don't search again
  129.   114 00A4:                     ; search for <space>NOLINE at end
  130.   115 00A4:41FA008F                         lea     nolnstrend(pc),a0
  131.   116 00A8:1024                 nolckloop   move.b  -(a4),d0         ; text char
  132.   117 00AA:0200005F                         andi.b  #CASEmask,d0
  133.   118 00AE:B020                             cmp.b   -(a0),d0         ; NOLINE mask char
  134.   119 00B0:660A                             bne.s   nonoline2
  135.   120 00B2:4A00                             tst.b   d0               ; <space> has become $0
  136.   121 00B4:66F2                             bne.s   nolckloop        ; not space, try more.
  137.   122 00B6:7A01                             moveq   #1,d5            ; set NOLINE flag.
  138.   123 00B8:528C                             addq.l  #1,a4
  139.   124 00BA:60D8                             bra.s   espace           ; back to kill space(s).
  140.   125 00BC:                     ;
  141.   126 00BC:                     ;-- Start the argument line scanning process:
  142.   127 00BC:4283                 nonoline2   clr.l   d3               ; Clear output-chars count.
  143.   128 00BE:4206                             clr.b   d6               ; Clear asterisk flag.
  144.   129 00C0:240A                             move.l  a2,d2
  145.   130 00C2:                     ;
  146.   131 00C2:                     ;-- Make new output line from argument line:
  147.   132 00C2:101D                 scan        move.b  (a5)+,d0         ; Get argument char.
  148.   133 00C4:67000036                         beq     exit             ; Zero means we're finsihed.
  149.   134 00C8:                     ;
  150.   135 00C8:                     ;-- Check special chars flag:
  151.   136 00C8:4A06                             tst.b   d6               ; Check asterisk flag.
  152.   137 00CA:671A                             beq.s   noastrsk         ; No asterisk?  Skip.
  153.   138 00CC:                     ;
  154.   139 00CC:                     ;-- Handle asterisk-plus-char:
  155.   140 00CC:1C00                             move.b  d0,d6
  156.   141 00CE:0206005F                         andi.b  #CASEmask,d6     ; Kill lower case.
  157.   142 00D2:0C060045                         cmpi.b  #69,d6           ; Test for E
  158.   143 00D6:6604                             bne.s   try2
  159.   144 00D8:103C001B                         move.b  #27,d0           ; E, substitute ESC
  160.   145 00DC:                     
  161.   146 00DC:0C06004E             try2        cmpi.b  #78,d6           ; Test for N
  162.   147 00E0:6612                             bne.s   putinbuf
  163.   148 00E2:103C000A                         move.b  #LF,d0           ; N, substitute Newline
  164.   149 00E6:                     ;
  165.   150 00E6:                     ;-- Check for quote:
  166.   151 00E6:0C000022             noastrsk    cmpi.b  #'"',d0          ; If char is quote,
  167.   152 00EA:67D6                             beq.s   scan             ;          skip it.
  168.   153 00EC:                     ;
  169.   154 00EC:                     ;-- Check for asterisk:
  170.   155 00EC:7C01                             moveq   #1,d6
  171.   156 00EE:0C00002A                         cmpi.b  #'*',d0          ; Is it '*'?
  172.   157 00F2:67CE                             beq.s   scan             ; Yes, log and get next char
  173.   158 00F4:                     ;
  174.   159 00F4:                     ;-- Put char in buffer:
  175.   160 00F4:4206                 putinbuf    clr.b   d6               ; Clear Asterisk flag
  176.   161 00F6:14C0                             move.b  d0,(a2)+         ; Put char to output buffer.
  177.   162 00F8:5203                             addq.b  #1,d3            ; Increment outchar count.
  178.   163 00FA:60C6                             bra.s   scan             ; Go for more input.
  179.   164 00FC:                     ;
  180.   165 00FC:                     ;-- After looking at all argument chars:
  181.  
  182.       ** Asm68k 68000 Macro Assembler **
  183.  
  184.  
  185.  LINE   PC         CODE         -----CARD------->
  186.   166 00FC:4A05                 exit        tst.b   d5               ; Check NOLINE flag.
  187.   167 00FE:6606                             bne.s   nolf
  188.   168 0100:14FC000A                         move.b  #LF,(a2)+        ; If it's 0, put a linefeed at end.
  189.   169 0104:5203                             addq.b  #1,d3            ;   & increment count to handle it.
  190.   170 0106:4A03                 nolf        tst.b   d3
  191.   171 0108:67000008                         beq     close
  192.   172 010C:                     ; D2 and D3 already contain buffer address and size
  193.   173 010C:2207                             move.l  d7,d1            ; Outhandle
  194.   174 010E:4EAE0000                         jsr     _LVOWrite(a6)    ; Print it!
  195.   175 0112:                     ;
  196.   176 0112:                     ;-- Unlink and close opened libraries:
  197.   177 0112:2844                 close       move.l  d4,a4
  198.   178 0114:4E5C                             unlk    a4
  199.   179 0116:224E                             move.l  a6,a1            ; DOSBase to A1
  200.   180 0118:2C780004                         move.l  AbsExecBase,a6   ;   Exec library...
  201.   181 011C:4EAE0000                         jsr     _LVOCloseLibrary(a6)    ;   close Dos library.
  202.   182 0120:4E75                 quit        rts                      ; Return control to CLI.
  203.   183 0122:                     ;
  204.   184 0122:                     ;-- Dos Library name:
  205.   185 0122:646F732E6C6962726172 dosname dc.b 'dos.library',0  ;name of  Dos library
  206.   186 012E:                     ;-- NoLine keyword
  207.   187 012E:00                               dc.b 0
  208.   188 012F:4E4F4C494E45         nolnstr     dc.b 'NOLINE'
  209.   189 0135:                     nolnstrend  equ  *
  210.   190 0135:00                               dc.b 0
  211.   191 0136:                     ;-- Template string:
  212.   192 0136:535452494E472C4E4F4C template dc.b 'STRING,NOLINE/S: '
  213.   193 0147:                     endtemp:
  214.   194 0147:                     templen  EQU   endtemp-template
  215.   195 0147:                     
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222. Assembled Echo.asm to Echo.o
  223. Object size = 327
  224. No Errors detected
  225. Free Ram used = 16384 Bytes
  226.  
  227.       ** Asm68k 68000 Macro Assembler **
  228.  
  229.  
  230.  
  231.  
  232.  
  233.               Symbol Table:
  234.  
  235.  
  236.   AbsExecBase         NUMBER   00000004
  237.   CASEmask            NUMBER   0000005F
  238.   LF                  NUMBER   0000000A
  239.   SPACE               NUMBER   00000020
  240.   _LVOCloseLibrary    EXTERN           
  241.   _LVOInput           EXTERN           
  242.   _LVOOpenLibrary     EXTERN           
  243.   _LVOOutput          EXTERN           
  244.   _LVORead            EXTERN           
  245.   _LVOWrite           EXTERN           
  246.   _main             ? ADDRESS  00000000
  247.   close               ADDRESS  00000112
  248.   dosname             ADDRESS  00000122
  249.   endtemp             ADDRESS  00000147
  250.   espace              ADDRESS  00000094
  251.   exit                ADDRESS  000000FC
  252.   findend             ADDRESS  0000008E
  253.   ljob                ADDRESS  00000064
  254.   lspace              ADDRESS  00000066
  255.   noastrsk            ADDRESS  000000E6
  256.   nolckloop           ADDRESS  000000A8
  257.   nolf                ADDRESS  00000106
  258.   nolinecklp          ADDRESS  00000078
  259.   nolnstr             ADDRESS  0000012F
  260.   nolnstrend          NUMBER   00000135
  261.   nonoline1           ADDRESS  0000008C
  262.   nonoline2           ADDRESS  000000BC
  263.   putinbuf            ADDRESS  000000F4
  264.   qspace              ADDRESS  00000028
  265.   quit                ADDRESS  00000120
  266.   scan                ADDRESS  000000C2
  267.   template            ADDRESS  00000136
  268.   templen             NUMBER   00000011
  269.   try2                ADDRESS  000000DC
  270.  
  271.  
  272.  
  273.   _main             ? ADDRESS  00000000
  274.   AbsExecBase         NUMBER   00000004
  275.   LF                  NUMBER   0000000A
  276.   templen             NUMBER   00000011
  277.   SPACE               NUMBER   00000020
  278.   qspace              ADDRESS  00000028
  279.   CASEmask            NUMBER   0000005F
  280.   ljob                ADDRESS  00000064
  281.   lspace              ADDRESS  00000066
  282.   nolinecklp          ADDRESS  00000078
  283.   nonoline1           ADDRESS  0000008C
  284.   findend             ADDRESS  0000008E
  285.   espace              ADDRESS  00000094
  286.  
  287.       ** Asm68k 68000 Macro Assembler **
  288.  
  289.  
  290.  
  291.   nolckloop           ADDRESS  000000A8
  292.   nonoline2           ADDRESS  000000BC
  293.   scan                ADDRESS  000000C2
  294.   try2                ADDRESS  000000DC
  295.   noastrsk            ADDRESS  000000E6
  296.   putinbuf            ADDRESS  000000F4
  297.   exit                ADDRESS  000000FC
  298.   nolf                ADDRESS  00000106
  299.   close               ADDRESS  00000112
  300.   quit                ADDRESS  00000120
  301.   dosname             ADDRESS  00000122
  302.   nolnstr             ADDRESS  0000012F
  303.   nolnstrend          NUMBER   00000135
  304.   template            ADDRESS  00000136
  305.   endtemp             ADDRESS  00000147
  306.